/* eslint-disable */
/**
 * 日期格式化
 * @param {string} fmt  格式，例如 yyyy-MM-dd HH:mm:ss
 */
Date.prototype.format = function (fmt) {
    var o = {
        "M+": this.getMonth() + 1,                 //月份
        "d+": this.getDate(),                    //日
        "h+": this.getHours(),                   //小时
        "H+": this.getHours(),                   //小时
        "m+": this.getMinutes(),                 //分
        "s+": this.getSeconds(),                 //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds()             //毫秒
    };
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    for (var k in o) {
        if (new RegExp("(" + k + ")").test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        }
    }
    return fmt;
}

/**
 * 获取当前时间
 * @param {Date} date
 */
function getCurrentDate(fmt = "yyyy-MM-dd") {
  return new Date().format(fmt)
}

/**
 * 获取指定时间的周一
 * @param {Date} date
 */
function getFirstDayOfWeek(date) {

    var weekday = date.getDay() || 7; //获取星期几,getDay()返回值是 0（周日） 到 6（周六） 之间的一个整数。0||7为7，即weekday的值为1-7

    date.setDate(date.getDate() - weekday + 1);//往前算（weekday-1）天，年份、月份会自动变化
    return date;
}

/**
 * 获取指定时间的周日
 * @param {Date} date
 */
function getLastDayOfWeek(date) {

    var weekday = date.getDay() || 7; //获取星期几,getDay()返回值是 0（周日） 到 6（周六） 之间的一个整数。0||7为7，即weekday的值为1-7

    date.setDate(date.getDate() + (7 - weekday));//往后算（7 - weekday ）天，年份、月份会自动变化
    return date;
}

/**
 * 获取指定时间当月的第一天
 * @param {Date} date
 */
function getFirstDayOfMonth(date) {
    date.setDate(1);
    return date;
}

/**
 * 获取指定时间当月的最好一天
 * @param {Date} date
 */
function getLastDayOfMonth(date) {
    date.setMonth(date.getMonth() + 1);
    date.setDate(0)
    return date;
}


/**
 * 获取指定时间的当季第一天
 * @param {Date} date
 */
function getFirstDayOfSeason(date) {
    var month = date.getMonth();
    if (month < 3) {
        date.setMonth(0);
    } else if (2 < month && month < 6) {
        date.setMonth(3);
    } else if (5 < month && month < 9) {
        date.setMonth(6);
    } else if (8 < month && month < 11) {
        date.setMonth(9);
    }
    date.setDate(1);
    return date;
}

/**
 * 获取指定时间的当季最后一天
 * @param {Date} date
 */
function getLastDayOfSeason(date) {
    var month = date.getMonth();
    if (month < 3) {
        date.setMonth(3);
    } else if (2 < month && month < 6) {
        date.setMonth(6);
    } else if (5 < month && month < 9) {
        date.setMonth(9);
    } else if (8 < month && month < 11) {
        date.setYear(date.getFullYear() + 1)
        date.setMonth(0);
    }
    date.setDate(0);
    return date;
}

/**
 * 获取指定时间的当年第一天
 * @param {Date} date
 */
function getFirstDayOfYear(date) {
    date.setDate(1);
    date.setMonth(0);
    return date
}

/**
 * 获取指定时间的当年最后一天
 * @param {Date} date
 */
function getLastDayOfYear(date) {
    date.setYear(date.getFullYear())
    date.setMonth(11);
    date.setDate(31);
    return date
}

/**
 * 将日期字符串从一种类型转换为另一种类型
 * @param {string} dateStr， 或者 date类型
 * @param {string} pattern
 */
function formatToAnotherPattern(dateStr,pattern = 'yyyy-MM-dd'){
    if(dateStr &&  dateStr instanceof Date ) {
      return dateStr.format(pattern)
    }
    if(dateStr === undefined || dateStr === null || dateStr.trim() === ""){
        return ""
    }
    if(pattern === undefined || pattern === null || pattern.trim() === ""){
        return ""
    }

    return new Date(dateStr).format(pattern)
}

/**
* @Description：获取多少天以后的日期
*/
function getDateAfterDays(dadd){
  var a = new Date()
  a = a.valueOf()
  a = a + dadd * 24 * 60 * 60 * 1000
  return new Date(a).format('yyyy-MM-dd')
}

/**
 * @Description：获取当前时间前后N天前后日期的方法
 */
function getDateBeforeDays(AddDayCount){
  var  dd =  new  Date();
  dd.setDate(dd.getDate()+AddDayCount); //获取AddDayCount天后的日期
  var  y = dd.getFullYear();
  var  m = (dd.getMonth()+1)<10? "0" +(dd.getMonth()+1):(dd.getMonth()+1); //获取当前月份的日期，不足10补0
  var  d = dd.getDate()<10? "0" +dd.getDate():dd.getDate(); //获取当前几号，不足10补0
  return  y+ "-" +m+ "-" +d;
}

//距离当前日期相差几天，外后的日期是正，往前的日期是负数
function  getDaysDiff(dateString1){
  var  startDate = Date.parse(dateString1);
  var days=(startDate- new Date())/(1*24*60*60*1000);
  return  days;
}

/**判断一个字符串是否为日期格式
 * @返回为false则是日期格式;isNaN(data)排除data为纯数字的情况（此处不考虑只有年份的日期，如‘2018’）
 */
function isDate(data){
  return isNaN(data)&&!isNaN(Date.parse(data))
}


/**判断一个字符串是否为日期格式
 * @返回为false则是日期格式;isNaN(data)排除data为纯数字的情况（此处不考虑只有年份的日期，如‘2018’）
 */
function isOverdue(str){
  var date = new Date(str );
  var now = new Date();
  return date <= now
}

/**
 * 计算两个日期之间的天数
 *  date1  开始日期 yyyy-MM-dd
 *  date2  结束日期 yyyy-MM-dd
 *  如果日期相同 返回一天 开始日期大于结束日期，返回0
 */
function  getDaysBetween(date1,date2){
  var  startDate = Date.parse(date1);
  var  endDate = Date.parse(date2);
  if (startDate>endDate){
    return 0;
  }
  if (startDate==endDate){
    return 1;
  }
  var days=(endDate - startDate)/(1*24*60*60*1000);
  return  days;
}

const dates = {
    getCurrentDate,
    getFirstDayOfWeek,
    getLastDayOfWeek,
    getFirstDayOfMonth,
    getLastDayOfMonth,
    getFirstDayOfSeason,
    getDateAfterDays,
    getLastDayOfSeason,
    getFirstDayOfYear,
    getLastDayOfYear,
    getDateBeforeDays,
    formatToAnotherPattern,
    toDate: formatToAnotherPattern,
    isDate: isDate,
    getDaysDiff: getDaysDiff,
    isOverdue: isOverdue,
    getDaysBetween: getDaysBetween,
    defaultDatePattern: 'yyyy-MM-dd',
    defaultDateTimePattern: 'yyyy-MM-dd HH:mm:ss',
    defaultDateYMPattern: 'yyyy-MM',
    pickerOptions: {
        // 时间区间
        timeInterval: {
            shortcuts: [
                {
                    text: '今天', onClick(picker) {
                        const end = new Date(new Date().toLocaleDateString() + " 23:59:59");
                        const start = new Date(new Date().toLocaleDateString() + " 00:00:00");
                        picker.$emit('pick', [start, end]);
                    }
                },{
                text: '最近7天', onClick(picker) {
                    const end = new Date();
                    const start = new Date();
                    start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
                    picker.$emit('pick', [start, end]);
                }
            }, {
                text: '最近30天', onClick(picker) {
                    const end = new Date();
                    const start = new Date();
                    start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
                    picker.$emit('pick', [start, end]);
                }
            }, {
                text: '最近90天', onClick(picker) {
                    const end = new Date();
                    const start = new Date();
                    start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
                    picker.$emit('pick', [start, end]);
                }
            }]
        },
        // 未来时间区间
        timeIntervalWitchFutureDate: {
          disabledDate(time) {
            return time.getTime() < Date.now();
          },
          shortcuts: [
            {
              text: '今天', onClick(picker) {
                const end = new Date(new Date().toLocaleDateString() + " 23:59:59");
                const start = new Date(new Date().toLocaleDateString() + " 00:00:00");
                picker.$emit('pick', [start, end]);
              }
            },{
              text: '最近7天', onClick(picker) {
                const end = new Date();
                const start = new Date();
                start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
                picker.$emit('pick', [start, end]);
              }
            }, {
              text: '最近30天', onClick(picker) {
                const end = new Date();
                const start = new Date();
                start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
                picker.$emit('pick', [start, end]);
              }
            }, {
              text: '最近90天', onClick(picker) {
                const end = new Date();
                const start = new Date();
                start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
                picker.$emit('pick', [start, end]);
              }
            }]
        },
        date: {    //日期快捷选择项
            disabledDate(time) {
                // return time.getTime() > Date.now();
            },
            shortcuts: [{
                text: '今天',
                onClick(picker) {
                    picker.$emit('pick', new Date());
                }
            }, {
                text: '昨天',
                onClick(picker) {
                    const date = new Date();
                    date.setTime(date.getTime() - 3600 * 24 * 1000);
                    picker.$emit('pick', date);
                }
            }]
        },
      pastDate: {
        disabledDate(time) {
          return time.getTime() > Date.now();
        }
      },
        futureDate: {    // 未来的时间选择
            disabledDate(time) {
                return time.getTime() < Date.now();
            },
            shortcuts: [{
                text: '今天',
                onClick(picker) {
                    picker.$emit('pick', new Date());
                }
            },{
                text: '本周日',
                onClick(picker) {
                    picker.$emit('pick', getLastDayOfWeek(new Date()));
                }
            },{
                text: '本月底',
                onClick(picker) {
                    picker.$emit('pick', getLastDayOfMonth(new Date()));
                }
            }]
        }
    }
}

export default dates
